#include <bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn = 1e5 + 10;
int n,m,q;
int pre[maxn]; // 并查集
int dep[maxn]; // 每个节点的深度
int fa[maxn][21]; // i 节点的第 2^j 个父亲节点 
int mn[maxn][21]; // i 节点到第 2^j 个父亲节点路径间的最小路径权值 
bool vis[maxn];


struct Edge{
	int u,v,w; // 相邻节点以及路径权值
	bool operator <(const Edge& e) const{ // 升序
		return w==e.w? u<e.u : w>e.w;
	}
};
vector<Edge> edges;


struct Node{
	int v,w; // 相邻节点及路径权值
};
vector<Node> tree[maxn];

int root(int x){
	return pre[x]=(pre[x]==x?x:root(pre[x])); // 路径优化
}

void kruskal(){
	sort(edges.begin(),edges.end());
	for(const auto& e: edges){
		if(root(e.u)==root(e.v)){ // 已经填上去了
			continue;
		}
		// 合并
		pre[root(e.u)]=root(e.v);
		// 构建树
		tree[e.u].push_back({e.v, e.w});
		tree[e.v].push_back({e.u, e.w});
	}
}

// 求深度 以及初始化 fa, mn
void dfs(int u, int p, int w){
	vis[u]=true; // 为了能够遍历所有的连通分支
	fa[u][0]=p;
	dep[u]=dep[p]+1;
	mn[u][0]=w;
	
	for(const auto& nd:tree[u]){
		int nex=nd.v;
		if(nex==p){
			continue;
		}
		dfs(nex, u, nd.w);
	}
}

// 树上倍增
int lca(int x, int y){
	int ans=1e18;
	if(dep[x]<dep[y]){ // 确保 x 更深
		swap(x, y); 
	}
	
	// 让 x 和 y 在同一深度
	for(int j=20;j>=0;j--){ // 先大步大步的跳
		if(dep[fa[x][j]]>=dep[y]){
			ans=min(ans,mn[x][j]); // 先更新最小值再跳
			x=fa[x][j];
		}
	}
	
	// 直接相等了
	if(x==y){
		return ans;
	}
	
	// 在同一深度后再同时往上跳
	for(int j=20;j>=0;j--){ // 还是大步大步的跳
		if(fa[x][j] != fa[y][j]){ // 父亲节点不同时再跳
			ans=min(ans,min(mn[x][j], mn[y][j])); // 先更新最小值再跳			
			x=fa[x][j];
			y=fa[y][j];
		}
	}
	
	// 最后他们的 直接父亲就是 lca
	ans=min(ans, min(mn[x][0], mn[y][0]));
	return ans;
}


void solve(){
	cin>>n>>m>>q;
	// 初始化 pre
	for(int i=1;i<=n;i++){
		pre[i]=i;
	}
	for(int i=1;i<=m;i++){
		int u, v, w;
		cin>>u>>v>>w;
		edges.push_back({u, v, w});
	}	
	
	// 最大生成树
	kruskal();
	
	memset(mn, 0x3f, sizeof(mn));
	
	// 注意不要忘记遍历所有的连通分支
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			dfs(i, 0, 0);
		}
	}
	
	for(int j=1;j<=20;j++){
		for(int i=1;i<=n;i++){
			fa[i][j]=fa[fa[i][j-1]][j-1];
			mn[i][j]=min(mn[i][j-1], mn[fa[i][j-1]][j-1]);
		}
	}
	
	
	// 开始 lca
	for(int i=1;i<=q;i++){
		int x,y;
		cin>>x>>y;
		if(root(x)!=root(y)){ // 不连通
			cout<<-1<<'\n';
			continue;
		}
		cout<<lca(x, y)<<'\n';
	}
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}
